<?php
/**
 * 代理模式
 *
 * 让真实角色的需要实现的功能转交给代理，本身处理其他的业务逻辑。
 */
//抽象主题角色，声明了真实主题和代理主题的共同接口。
abstract class Subject{

	abstract public function Request();
}
//真实主题角色，定义了代理主题的真实对象
class RealSubject extends Subject
{
	public function Request()
	{
		//让客户端认为是实现了真实接口
		echo "Called RealSubject Request".PHP_EOL;
	}
}
//代理角色
class Proxy extends Subject{
	//真实角色的引用
	public $RealSubject;
	//方法
	public function Request(){
		if(!$this->RealSubject instanceof RealSubject)
		{
			$this->RealSubject = new RealSubject();
		}
		$this->preRequest();
		$this->RealSubject->Request();
		$this->postRequest();
	}
	//代理角色实现本该由真实角色实现的方法。
	public function preRequest()
	{
		echo "PreRequest".PHP_EOL;
	}
	public function postRequest()
	{
		echo "postRequest".PHP_EOL;
	}
}
//代理角色
$p = new Proxy();
$p->Request();